home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_300
/
365_01
/
atari.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-04-04
|
3KB
|
162 lines
/* atari.c */
/* Author:
* Guntram Blohm
* Buchenstrasse 19
* 7904 Erbach, West Germany
* Tel. ++49-7305-6997
* sorry - no regular network connection
*/
/*
* This file contains the 'standard' functions which are not supported
* by Atari/Mark Williams, and some other TOS-only requirements.
*/
#include "config.h"
#include "vi.h"
#if TOS
#include <osbind.h>
/* vi uses mode==0 only ... */
int access(file, mode)
char *file;
{
int fd=Fopen(file, 0);
if (fd<0)
return -1;
Fclose(fd);
return 0;
}
char *mktemp(template)
char *template;
{
return template;
}
#ifndef __GNUC__
char *getcwd(buf, size)
char *buf;
{
if (size < 2 + 64)
return (char *)0;
buf[0] = Dgetdrv() + 'A';
buf[1] = ':';
Dgetpath(buf + 2, 0);
return buf;
}
#endif
/* read -- text mode, compress \r\n to \n
* warning: might fail when maxlen==1 and at eol
*/
int tread(fd, buf, maxlen)
int fd;
char *buf;
int maxlen;
{
int i, j, nread=read(fd, buf, (unsigned)maxlen);
if (nread && buf[nread-1]=='\r')
{ nread--;
lseek(fd, -1l, 1);
}
for (i=j=0; j<nread; i++,j++)
{ if (buf[j]=='\r' && buf[j+1]=='\n')
j++;
buf[i]=buf[j];
}
return i;
}
int twrite(fd, buf, maxlen)
int fd;
char *buf;
int maxlen;
{
int i, j, nwritten=0, hadnl=0;
char writbuf[BLKSIZE];
for (i=j=0; j<maxlen; )
{
if ((writbuf[i++]=buf[j++])=='\n')
{ writbuf[i-1]='\r';
if (i<BLKSIZE)
writbuf[i++]='\n';
else
hadnl=1;
}
if (i==BLKSIZE)
{
write(fd, writbuf, (unsigned)i);
i=0;
}
if (hadnl)
{
writbuf[i++]='\n';
hadnl=0;
}
}
if (i)
write(fd, writbuf, (unsigned)i);
return j;
}
/* The "timer" variable is used as a shadow of the system's timer. Since the
* system's timer can only be accessed in Supervisor mode, we are forced to
* do a Supexec(gettime) to copy the system's timer in to the User-mode "timer"
* variable.
*/
static int timer;
static gettime()
{
timer = *(long *)(0x4ba);
}
/* This function implements a read-with-timeout from the keyboard. */
/*ARGSUSED*/
int ttyread(buf, len, time)
char *buf; /* where to store the gotten characters */
int len; /* maximum number of characters to get -- ignored */
int time; /* maximum time to allow for reading */
{
int pos=0;
long l;
long endtime;
/* compute the ending time, in increments of 1/200th seconds */
Supexec(gettime);
endtime = time * 20 + timer;
/* wait until time runs out, or we get a keystroke */
while (!pos && (!time || timer < endtime))
{
if (Bconstat(2))
{
l = Bconin(2);
buf[pos] = l;
if (buf[pos++] == '\0')
{
buf[pos - 1] = '#';
buf[pos++] = l >> 16;
}
}
Supexec(gettime);
}
return pos;
}
/* This function writes characters to the screen */
ttywrite(buf, len)
char *buf;
int len;
{
while (len--)
Bconout(2, *buf++);
}
#endif